package student.aistar.day11;

import java.util.*;

/**
 * 数据存储的形式是key - value, 针对key是无序不可重复的
 * jdk8.0之前, 底层的数据结构是桶数组+链表
 *
 * jdk8.0之后, 底层的数据结构是桶数组+链表+红黑树
 *
 * 桶数组 - 里面的元素放在数组的这个位置是通过一个哈希算法计算得到的
 */
public class HashMapDemo {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1,"java");
        map.put(2,"python");
        //hashmap的key和value是允许为null
//        map.put(null, null);
        System.out.println(map.put(1, "oracle"));

        //如果后面的key和前面的key重复了, 后面的key的value会覆盖前面的key的value
        //key是没有覆盖的, 只是旧值覆盖了新值而已
        System.out.println(map);

        //获取集合的大小
        System.out.println(map.size());//3

        //根据key获取value
        System.out.println(map.get(2));

        //清空map
//        map.clear();

        System.out.println(map.isEmpty());//判断集合的元素的个数是否为0

        //判断map集合中是否包含某个key
        System.out.println(map.containsKey(2));//true

//        map.remove(2);//根据key进行删除操作

        //获取maps集合中所有的value
        Collection<String> values = map.values();
        System.out.println(values);

        //手写map的集合迭代方式
//        System.out.println(map);

        //第一种种方式 - 将map集合中所有的key全部取出来放入到一个Set集合中
        //Set集合 - 无序不可重复, map集合的key也是无序不可重复的
        Set<Integer> set = map.keySet();
        //遍历set
        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            Integer key = iterator.next();
            String value = map.get(key);
            System.out.println(key+": "+value);
        }


        //第二种方式 - 将map集合中的每对key - value封装到一个内置的Entry对象中
        //然后将每个entry对象放入到Set集合中
        System.out.println("=======第二种方式=======");
        Set<Map.Entry<Integer, String>> maps = map.entrySet();
        Iterator<Map.Entry<Integer, String>> entryIterator = maps.iterator();
        while (entryIterator.hasNext()){
            Map.Entry<Integer, String> next = entryIterator.next();
            Integer key = next.getKey();
            String value = next.getValue();
            System.out.println(key + ": "+value);
        }
    }
}
